package com.zzl.car.service;

import com.alibaba.fastjson.JSON;
import com.rabbitmq.client.Channel;
import com.zzl.car.context.ZdpJwtUserContext;
import com.zzl.car.entity.CarDetailInfo;
import com.zzl.car.entity.CarOrder;
import com.zzl.car.entity.User;
import com.zzl.car.exception.ZdpException;
import com.zzl.car.util.ZdpDrivingLicense;
import com.zzl.car.util.ZdpGetIllegal;
import com.zzl.car.util.ZdpMailUtil;
import com.zzl.car.util.ZdpRandomUtil;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.mail.MessagingException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;

@Component
public class ConsumerService {

    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private ZdpDrivingLicense zdpDrivingLicense;
    @Autowired
    private UserService userService;
    @Autowired
    private zdpWebSocket zdpWebSocket;

    /*
    * 审核驾驶证
    * */
    @RabbitListener(queuesToDeclare = @Queue("auditLicense"))
    public void auditLicense(Map<String,Object> map){
        System.out.println("进行驾驶证验证");
        Object usertemp =map.get("user");
        String ss = JSON.toJSONString(usertemp);
        User user = JSON.parseObject(ss,User.class);

        Map<String,Object> result1 = new HashMap<>();
        List<String> files = (List<String>)map.get("images");
        // 将二进制读到内存中
        for(String file:files){
//            System.out.println(file);
            try {
                // base64 转 url
                String imgParam = URLEncoder.encode(file, "utf-8");
                // 开始识别
               String result =  zdpDrivingLicense.drivingLicense(imgParam);
               // 转为json
                result1 = JSON.parseObject(result,Map.class);
//                System.out.println("识别后的数据转换为Json后");
               if(result1.get("error_msg")==null){ // 说明验证成功
                   break;
               }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                user.setAudit(3);
                userService.updateUserInfo(user);
                zdpWebSocket.sendMessageByString(user.getTelephone(),"审核未通过");
            }
        }
        System.out.println("验证后的数据");
        System.out.println(result1);
        // 开始判断
        Map<String,Object> temp= (Map)result1.get("words_result");
        String endTime =((Map<String,String>)temp.get("至")).get("words");
        /*手动将LinkedHashMap转换为实体类，通过Json作为中介*/
        if(user==null||result1.get("error_msg")!=null){
            // 审核未通过
            user.setAudit(3);
            userService.updateUserInfo(user);
            zdpWebSocket.sendMessageByString(user.getTelephone(),"审核未通过");
            return ;
        }
        // 判断是否过期
        String nowTime = new SimpleDateFormat("yyyyMMdd").format(new Date());
        if(endTime.compareTo(nowTime) <=0){
            System.out.println("驾驶证过期");
            // 说明过期或者即将过期
            user.setAudit(3);
            userService.updateUserInfo(user);
            zdpWebSocket.sendMessageByString(user.getTelephone(),"审核未通过");
        }
        System.out.println("驾驶证未过期");
        // 判断是否与用户传入的身份证是否一致
        String identify =((Map<String,String>)temp.get("证号")).get("words");

        if(user.getIdentify()!=null){
            if(!user.getIdentify().equals(identify)){
                // 不相同，审核不通过
                System.out.println("身份证不同，审核不通过");
                user.setAudit(3);
                userService.updateUserInfo(user);
                zdpWebSocket.sendMessageByString(user.getTelephone(),"审核未通过");
            }else{
                System.out.println("审核通过");
                // 审核通过，改变状态
                user.setAudit(2);
                userService.updateUserInfo(user);
                zdpWebSocket.sendMessageByString(user.getTelephone(),"审核已通过");
            }
        }else{
            System.out.println("身份证还未上传");
            user.setAudit(3);
            userService.updateUserInfo(user);
            zdpWebSocket.sendMessageByString(user.getTelephone(),"审核未通过");
        }
    }


    /*
    * 发送邮箱验证码
    * 使用第一种模型
    * 不需要绑定交换机
    * */
    @RabbitListener(queuesToDeclare =@Queue("verify"))
    public void sendEmail(String message){
            //邮箱发送验证码
        try {
            String random = ZdpRandomUtil.createRandom(4);
            //验证码存储到redis数据库
            redisTemplate.opsForValue().set("verify-"+message,random,10, TimeUnit.MINUTES);

            String content = "您正在进行邮箱验证，验证码为"+random+".\n验证码将在十分钟后失效";
            ZdpMailUtil.sendMessage(message,"zdp汽车租赁系统验证码",content);
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /*
    * 工作者模型 获取违章记录
    * */
    @RabbitListener(queuesToDeclare = @Queue(value = "getIllegal"))
    public void getIllegal(CarOrder carOrder) throws IOException {

        //传入车牌号和发动机号
        Map result = ZdpGetIllegal.getIllegal(carOrder.getCarDetailInfo().getCarPlate(),
                carOrder.getCarDetailInfo().getCarEngine());
        //一个号码最多测试100次
        int count = 0;
        while( ( (Integer)result.get("code") )!=200&&count<100){
            //说明没有成功
            result = ZdpGetIllegal.getIllegal(carOrder.getCarDetailInfo().getCarPlate(),
                    carOrder.getCarDetailInfo().getCarEngine());
            count++;
        }
        if(( (Integer)result.get("code") )!=200){
            //说明没有成功
            //咋办呢 不知道 放着吧
            return ;
        }
        //成功了就继续进行处理呗
        //发送信息，让别的消费者插入违章记录，并发送通知信息
        Map<String,Object> data = (Map)result.get("data");
        if( ((Integer)data.get("detail") )==0){
            //说明没有违章
            return ;
        }else{
            //有违章 就生成违章记录，并插入
            //没有违章的信息给我参考。。。
        }

    }
    @RabbitListener(queuesToDeclare = @Queue(value="getIllegal"))
    public void getIllegal1(CarOrder carOrder) throws IOException {
        //传入车牌号和发动机号
        Map result = ZdpGetIllegal.getIllegal(carOrder.getCarDetailInfo().getCarPlate(),
                carOrder.getCarDetailInfo().getCarEngine());
        //一个号码最多测试100次
        int count = 0;
        while( ( (Integer)result.get("code") )!=200&&count<100){
            //说明没有成功
            result = ZdpGetIllegal.getIllegal(carOrder.getCarDetailInfo().getCarPlate(),
                    carOrder.getCarDetailInfo().getCarEngine());
            count++;
        }
        if(( (Integer)result.get("code") )!=200){
            //说明没有成功
            //咋办呢 不知道 放着吧
            return ;
        }
        //成功了就继续进行处理呗
        //发送信息，让别的消费者插入违章记录，并发送通知信息
        Map<String,Object> data = (Map)result.get("data");
        if( ((Integer)data.get("detail") )==0){
            //说明没有违章
            return ;
        }else{
            //有违章 就生成违章记录，并插入
            //没有违章的信息给我参考。。。
        }
    }

    /*
    * 发送违章处理邮件
    * */
    @RabbitListener(queuesToDeclare = @Queue("noticeIllegal"))
    public void sendNoticeIllegal(User user) throws GeneralSecurityException, MessagingException {
        System.out.println("NoticeIllegal======="+user);
        String content = "尊敬的手机号为:"+user.getTelephone()+"的用户您好，你在zzl汽车租赁系统中还有违章记录尚未处理。\n请及时处理。";
        ZdpMailUtil.sendMessage(user.getEmail(),"zzl汽车租赁系统违章处理通知",content);
    }

}
